/*
 * 
 *
 * Authors: Soeren Gebbert, soeren.gebbert@vti.bund.de
 *          Axel Don, axel.don@vti.bund.de
 *
 * Copyright:
 *
 * Johann Heinrich von Thünen-Institut
 * Institut für Agrarrelevante Klimaforschung
 *
 * Phone: +49 (0)531 596 2601
 *
 * Fax:+49 (0)531 596 2699
 *
 * Mail: ak@vti.bund.de
 *
 * Bundesallee 50
 * 38116 Braunschweig
 * Germany
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef PARTICLE_BASE_H
#define PARTICLE_BASE_H

#include <stdlib.h>
#include <math.h>
#include <stdio.h>

#include "initial_parameters.h"
#include "runtime_parameters.h"

/* Base class for carbon particle and micro-organism cluster */
class particle_base {
public:
    particle_base();
    particle_base(initial_parameters *init_params) ;
    particle_base(initial_parameters *init_params, runtime_parameters *run_params);
    /**
     *  Set the pointer to the current runtime parameters object 
     * @param run_params
     */
    virtual void set_runtime_parameters(runtime_parameters *run_params);
    /** 
     * Return the runtime parameter pointer
     */
    virtual runtime_parameters * get_runtime_parameters();
    
    /**
     *  Set the pointer to the initial parameters object
     * @param init_params
     */
    virtual void set_initial_parameters(initial_parameters *init_params);
    /** 
     * Return the initial parameters pointer 
     */
    virtual initial_parameters * get_initial_parameters();
    /**
     * Return the x coordinate
     * @return 
     */
    virtual float get_x(){return this->x;}
    /**
     * Return the y coordinate
     * @return 
     */
    virtual float get_y(){return this->y;}
    /**
     * Return the z coordinate
     * @return 
     */
    virtual float get_z(){return this->z;}
    /**
     * Set the x coordinate
     * @param x
     * @return 
     */
    virtual void set_x(float x){this->x = x;}
    /**
     * Set the y coordinate
     * @param y
     * @return 
     */
    virtual void set_y(float y){this->y = y;}
    /**
     * Set the z coordinate
     * @param z
     * @return 
     */
    virtual void set_z(float z){this->z = z;}

protected:
    float x;
    float y;
    float z;
    initial_parameters *init_params;
    runtime_parameters *run_params;
};
#endif
